interface Listener {
    // your code
    [propName: string]:any // propName 任意为string的名称  结果可以是任意值
    // (word: string): string;
} // 留个？
interface Events {
      name:string,
      event:any,
      open:boolean
}
  
  class EventEmitter {
    // your code 定义私有属性 events
    private events:Events[] = [];// 暂存起来 等别人emit的时候再去调用他的event
    on (eventName: string, listener: Listener) { // listener 希望传什么？
      // your code
        let obj  = {
            name: eventName,
            event: listener,
            open: true,
        }
        this.events.push(obj)
    }
    emit (eventName: string, ...args: any[]) {
      // your code
      this.events.forEach((item:any) => {
        //  递归遍历找到他然后执行他
        if(item.name === eventName && item.open) {
          item.event(...args)
        }
      })
    }
    // 卸载订阅
    off (eventName: string, listener: Listener) {
      // your code
      this.events.forEach((item:any) => {
        //  递归遍历找到他然后关掉它
        if(item.name === eventName) {
            item.open = false;
        }
      })
    }
    once (eventName: string, data:any) {
      // your code
      this.events.forEach((item:any) => {
        //  递归遍历找到他然后执行他
        if(item.name === eventName && item.open) {
          item.event(data)
          item.open = false;
        }
      })
    }
  
  }
  
  // 调用示例
  const req = new EventEmitter()
  
  req.on('buy',(str:any) => {
    console.log(`价格是：${str}`)
  })
//   req.off('buy','')

  req.once('buy', '100快')
  req.once('buy', '100快')
  req.once('buy', '100快')
  req.once('buy', '100快')
  
  
  
  // const handler = () => {
  //   console.log('hello world')
  // }
  
  // // req.on('data', handler)
  
  // req.once('data', handler)
  
  // // req.off('data', handler)
  
  // req.emit('data')
  // req.emit('data')
  
  
  
  